home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 001-025 / disk_023 / ver30 / sys / amiga / fileio.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  3KB  |  166 lines

  1. /*
  2.  * Name:    MicroEMACS
  3.  * Version:    31
  4.  *        Commodore Amiga file I/O.
  5.  * Last edit:    15-Apr-86
  6.  * By:        Mic Kaczmarczik
  7.  *        ...ihnp4!seismo!ut-sally!ut-ngp!mic
  8.  *
  9.  * Read and write ASCII files. All
  10.  * of the low level file I/O knowledge is here.
  11.  * Pretty much vanilla standard I/O.
  12.  */
  13. #include    "def.h"
  14.  
  15. static    FILE    *ffp;
  16.  
  17. /*
  18.  * Open a file for reading.
  19.  */
  20. ffropen(fn)
  21. char    *fn;
  22. {
  23.     if ((ffp=fopen(fn, "r")) == NULL)
  24.         return (FIOFNF);
  25.     return (FIOSUC);
  26. }
  27.  
  28. /*
  29.  * Open a file for writing.
  30.  * Return TRUE if all is well, and
  31.  * FALSE on error (cannot create).
  32.  */
  33. ffwopen(fn)
  34. char    *fn;
  35. {
  36. #ifdef MANX
  37.     register int    fd;
  38. #endif
  39.     FILE *fdopen();
  40.  
  41. /* Why so clumsy under MANX, am I missing something? -- fnf */
  42. #ifdef MANX
  43.     if ((fd=creat(fn, 0)) < 0
  44.     || (ffp=fdopen(fd, "w")) == NULL) {
  45. #else
  46.     if ((ffp=fopen(fn, "w")) == NULL) {
  47. #endif
  48.         eprintf("Cannot open file for writing");
  49.         return (FIOERR);
  50.     }
  51.     return (FIOSUC);
  52. }
  53.  
  54. /*
  55.  * Close a file.
  56.  * Should look at the status.
  57.  */
  58. ffclose()
  59. {
  60.     fclose(ffp);
  61.     return (FIOSUC);
  62. }
  63.  
  64. /*
  65.  * Write a line to the already
  66.  * opened file. The "buf" points to the
  67.  * buffer, and the "nbuf" is its length, less
  68.  * the free newline. Return the status.
  69.  * Check only at the newline.
  70.  */
  71. ffputline(buf, nbuf)
  72. register char    buf[];
  73. {
  74.     register int    i;
  75.  
  76.     for (i=0; i<nbuf; ++i)
  77.         putc(buf[i]&0xFF, ffp);
  78.     putc('\n', ffp);
  79.     if (ferror(ffp) != FALSE) {
  80.         eprintf("Write I/O error");
  81.         return (FIOERR);
  82.     }
  83.     return (FIOSUC);
  84. }
  85.  
  86. /*
  87.  * Read a line from a file, and store the bytes
  88.  * in the supplied buffer. Stop on end of file or end of
  89.  * line. Don't get upset by files that don't have an end of
  90.  * line on the last line; this seem to be common on CP/M-86 and
  91.  * MS-DOS (the suspected culprit is VAX/VMS kermit, but this
  92.  * has not been confirmed. If this is sufficiently researched
  93.  * it may be possible to pull this kludge). Delete any CR
  94.  * followed by an LF.
  95.  */
  96. ffgetline(buf, nbuf)
  97. register char    buf[];
  98. {
  99.     register int    c;
  100.     register int    i;
  101.  
  102.     i = 0;
  103.     for (;;) {
  104.         c = getc(ffp);
  105.         if (c == '\r') {        /* Delete any non-stray    */
  106.             c = getc(ffp);        /* carriage returns.    */
  107.             if (c != '\n') {
  108.                 if (i >= nbuf-1) {
  109.                     eprintf("File has long line");
  110.                     return (FIOERR);
  111.                 }
  112.                 buf[i++] = '\r';
  113.             }
  114.         }
  115.         if (c==EOF || c=='\n')        /* End of line.        */
  116.             break;
  117.         if (i >= nbuf-1) {
  118.             eprintf("File has long line");
  119.             return (FIOERR);
  120.         }
  121.         buf[i++] = c;
  122.     }
  123.     if (c == EOF) {                /* End of file.        */
  124.         if (ferror(ffp) != FALSE) {
  125.             eprintf("File read error");
  126.             return (FIOERR);
  127.         }
  128.         if (i == 0)            /* Don't get upset if    */
  129.             return (FIOEOF);    /* no newline at EOF.    */
  130.     }
  131.     buf[i] = 0;
  132.     return (FIOSUC);
  133. }
  134.  
  135. /*
  136.  * Make a file name for a backup copy.
  137.  */
  138. fbackupfile(fname)
  139. char    *fname;
  140. {
  141.     strcat(fname,"~");
  142.     return (TRUE);
  143. }
  144.  
  145. /*
  146.  * The string "fn" is a file name.
  147.  * Perform any required case adjustments. All sustems
  148.  * we deal with so far have case insensitive file systems.
  149.  * We zap everything to lower case. The problem we are trying
  150.  * to solve is getting 2 buffers holding the same file if
  151.  * you visit one of them with the "caps lock" key down.
  152.  * On UNIX file names are dual case, so we leave
  153.  * everything alone.
  154.  */
  155. adjustcase(fn)
  156. register char    *fn;
  157. {
  158.     register int    c;
  159.  
  160.     while ((c = *fn) != 0) {
  161.         if (c>='A' && c<='Z')
  162.             *fn = c + 'a' - 'A';
  163.         ++fn;
  164.     }
  165. }
  166.